下面用springmvc拦截器对用户访问首页做一个简单的身份认证
1、spring-mvc.xml添加配置
<mvc:interceptors>
<mvc:interceptor>
<!-- 匹配的是url路径, 如果不配置或/**,将拦截所有的Controller -->
<mvc:mapping path="/goindex.do" />
<bean class="com.frame.interceptor.CommonInterceptor"></bean>
</mvc:interceptor>
<!-- 当设置多个拦截器时,先按顺序调用preHandle方法,然后逆序调用每个拦截器的postHandle和afterCompletion方法 -->
</mvc:interceptors>
2、控制层
package com.frame.core.ctrl;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class loginCtrl {
private static Logger log = Logger.getLogger(loginCtrl.class);
@RequestMapping(value = "/goindex")
public ModelAndView goindex() {
ModelAndView mav = new ModelAndView("index");
mav.addObject("name", "笑傲江湖");
mav.addObject("projectName", "Freemarker框架");
return mav;
}
@RequestMapping(value = "/login")
public void login(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
request.getSession().setAttribute("username", "身份认证成功");
request.getRequestDispatcher("/index.jsp").forward(request, response);
}
}
3、拦截器类
package com.frame.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
public class CommonInterceptor extends HandlerInterceptorAdapter{
private final Logger log = LoggerFactory.getLogger(CommonInterceptor.class);
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
String requestUri = request.getRequestURI();
String contextPath = request.getContextPath();
String url = requestUri.substring(contextPath.length());
System.out.println("requestUri:"+requestUri);
System.out.println("contextPath:"+contextPath);
System.out.println("url:"+url);
String username = (String)request.getSession().getAttribute("username");
if(username == null){
System.out.println("Interceptor:跳转到index页面!");
request.getRequestDispatcher("/index.jsp").forward(request, response);
return false;
}else
return true;
}
/**
* 在业务处理器处理请求执行完成后,生成视图之前执行的动作
* 可在modelAndView中加入数据
*/
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
if(modelAndView != null){
modelAndView.addObject("var", "postHandle已处理");
}
}
/**
* 在DispatcherServlet完全处理完请求后被调用,可用于清理资源等
*
* 当有拦截器抛出异常时,会从当前拦截器往回执行所有的拦截器的afterCompletion()
*/
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception {
}
}
4、/webapp/index.jsp
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<body>
<form action="<%=request.getContextPath()%>/login.do" method="post">
<input type="submit" value="登录" />
</form>
<h2><a href="<%=request.getContextPath()%>/goindex.do">go</a></h2>
<%=request.getSession().getAttribute("username") %>
</body>
</html>
5、/webapp/views/index.html
<!DOCTYPE html>
<html lang="en" class="app">
<head>
<@head/>
</head>
<body class="">
<@header/>
<br/>
<br/>
<br/>
<br/>
middle
<br/>
<br/>
<br/>
<br/>
<@footer/>
</body>
</html>
/webapp是springmvc整合freemarker时设置的web文件部署根目录
效果
index.jsp页面原始效果,session为null,用户没有访问go-index.html权限
点击登录,保存session,用户拥有访问go-index.html权限