首先要说下要实现的功能:一个网站可以分成两类页面或者操作,一类无需登陆就可以进行访问或操作,另一类需要登陆才可以进行访问或操作。
具体来说,我们现在有两个页面 login.jsp 和 index.jsp,其中login.jsp无需登陆 而 index.jsp需要登陆。
采用的做法是,在另一篇博客中指出,详见https://blog.csdn.net/qq_21294095/article/details/85019603标题二
1.将页面都放入WEB-INF目录下,借由controller进行间接访问。
@RequestMapping("/login")
public String loginPage(){
return "login"; //这里的字符串就是通过视图定位直接定位到page下的视图
}
@RequestMapping("/index")
public String indexPage(){
return "index";
}
2.编写真正处理登陆请求的方法
@RequestMapping(value="/login.do", method = RequestMethod.POST)
public ModelAndView login(User model, HttpSession session){
ModelAndView mav = new ModelAndView();
User user = userDao.get(model.getName());
if(user == null){ //用户不存在
mav.setViewName("redirect:login");
}else if(!user.getPassword().equals(model.getPassword())){ //密码错误
mav.setViewName("redirect:login");
}else{ //正确
session.setAttribute("user", user);
mav.setViewName("redirect:index");
}
return mav;
}
3.接着对请求进行拦截
<mvc:interceptors>
<mvc:interceptor>
<!-- 拦截所有的请求 -->
<mvc:mapping path="/**"/>
<!-- 不拦截login请求和login.do请求 -->
<mvc:exclude-mapping path="/user/login"/>
<mvc:exclude-mapping path="/user/login.do"/>
<bean class="com.interceptor.AuthorityInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
4.编写拦截器类
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String uri = request.getRequestURI();
System.out.println(uri);
User user = (User) request.getSession().getAttribute("user");
if(user == null){ //未登陆
response.sendRedirect("/Mall2/user/login");
return false;
}
return true;
}