写拦截器的事例出现了一个错误,找了很久,解决了问题就决定放上来。
首先是一个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会遭到拦截器的拦截,这正是拦截器的作用所在。
只有输入正确的账号密码才能看到main.jsp