天天看点

SpringMVC 拦截器实现

写拦截器的事例出现了一个错误,找了很久,解决了问题就决定放上来。

首先是一个userController

package org.fkit.controller;

import javax.servlet.http.HttpSession;

import org.fkit.user.User3;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller 
public class User3Controller {
	@RequestMapping (value="/login")
	public ModelAndView login(String loginname,String password,ModelAndView mv,HttpSession session){
		if(loginname!=null&&loginname.equals("tyf")&&password!=null&&password.equals("123"))
		{
			User3 user=new User3();
			user.setLoginname(loginname);
			user.setPassword(password);
			user.setUsername("管理员");
			session.setAttribute("user", user);
			mv.setViewName("redirect:main");
		}
		else{
			mv.addObject("message", "登录名密码错误");
			mv.setViewName("loginForm");
		}
		return mv;
	}
}
           

登录页面loginForm.jsp

<form action="login" method="post">
    	<font color="red">${requestScope.message}</font><br>
    	登录名:<input type="text" name="loginname"><br>
    	密码:<input type="password" name="password"><br>
    	<input type="submit" value="登录">
    </form>
           

再是跳转到main action的控制器BookController

package org.fkit.controller;


import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller 
public class BookController {
	@RequestMapping (value="/main")
	public String main(Model model){
		return "main";
	}
}
           

关键的地方来了就是我们的拦截器部分

package org.fkit.interceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.fkit.user.User3;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

public class AuthorInterceptor implements HandlerInterceptor{
	private static final String [] IGNORE={"/loginForm","/login"};
	@Override
	public void afterCompletion(HttpServletRequest arg0,
			HttpServletResponse arg1, Object arg2, Exception arg3)
			throws Exception {
		System.out.println("AuthorInterceptor afterCompletion执行了");
		
	}

	@Override
	public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,
			Object arg2, ModelAndView arg3) throws Exception {
		System.out.println("AuthorInterceptor postHandler执行了");
		
	}

	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
			Object handle) throws Exception {
		System.out.println("AutuorInterceprtor preHandle执行开始");
		boolean flag=false;
		String servletPath=request.getServletPath();
		for(String s:IGNORE)
			if(servletPath.contains(s))
			{
				flag=true;
				break;
			}
		if(!flag){
			User3 user=(User3)request.getSession().getAttribute("user");
			if(user==null){
				System.out.println("AuthorInteceptor拦截请求:");
				request.setAttribute("message","请先登录再访问");
				request.getRequestDispatcher("/WEB-INF/content/loginForm.jsp").forward(request, response);				
			}
			else{
				System.out.println("放行请求");
				flag=true;
			}
		}
		return flag;
	}
	
}
           

我出现的错误正是

request.getRequestDispatcher("/WEB-INF/content/loginForm.jsp").forward(request, response);
           

一开始只写了loginForm,浏览器解析不出,报了404,我是根据书本写的,不知道为什么会出这种错误。

springMVC的配置文件

<mvc:interceptors>
		<mvc:interceptor>
			<mvc:mapping path="/**"/>
			<bean class="org.fkit.interceptor.AuthorInterceptor"/>
		</mvc:interceptor>
	</mvc:interceptors>
           

main.jsp是获取登录权限之后可以进去的页面,如果我们没有登录就直接访问main会遭到拦截器的拦截,这正是拦截器的作用所在。

SpringMVC 拦截器实现

只有输入正确的账号密码才能看到main.jsp

继续阅读