import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target({ElementType.TYPE,ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) public @interface NeedLogin { /** * 用来确定没有登录后跳到哪里 * 如果有值,则使用returnUrl做为跳转,否则根据业务跳到指定url * @return */ String returnUrl() default ""; }
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.method.HandlerMethod; import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; import com.portal.model.User; public class CheckLoginInterceptor extends HandlerInterceptorAdapter { private final static Logger LOGGER = LoggerFactory.getLogger(CheckLoginInterceptor.class); /** 配置登录页面url,如果没登录且没有配置自定义的跳转,那么跳到这里 */ public static final String LOGIN_PAGE_URL = "/html/manage/manageLogin.jsp"; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { if (handler instanceof HandlerMethod) { HandlerMethod method = (HandlerMethod) handler; // 获取方法上有没有打注解 NeedLogin needLogin = method.getMethodAnnotation(NeedLogin.class); // 不为null表示该方法打了注解需要校验是否登录了 if (needLogin != null) { // 先获取当前请求的请求参数 String query = StringUtils.isNotEmpty(request.getQueryString()) ? ("?" + request.getQueryString()) : ""; // 先获取当前请求的请求完整url String callBackUrl = request.getRequestURL().toString() + query; LOGGER.info("当前请求的url:%s"+ callBackUrl); LOGGER.info( "当前请求需要登录后才能请求,开始检验是否登录!"); // 判断是否登录了 User user = (User) request.getSession().getAttribute("user"); if(user == null){//如果session中没有用户的信息,跳转到登录页面,内部网页不能访问 LOGGER.info("------未获取到登录用户信息-----"); request.getRequestDispatcher("/html/manage/manageLogin.jsp").forward(request, response); return false; }else return true; } } return true; } }
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> <context:component-scan base-package="com.####.controller" /> <mvc:annotation-driven /> <mvc:default-servlet-handler /> <!-- 对模型视图名称的解析,即在模型视图名称添加前后缀 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> <!-- <property name="prefix" value="/user/"/> --> <property name="suffix" value=".jsp" /> </bean> <!-- 支持上传文件 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver" > <!-- 100M --> <property name="maxUploadSize" value="104857600"></property> <property name="defaultEncoding" value="utf-8"></property> </bean> <!-- 拦截器 --> <mvc:interceptors> <mvc:interceptor> <!-- 拦截全部地址 --> <mvc:mapping path="/**" /> <!-- 登录拦截类 --> <bean id="loginInterceptor" class="com.portal.common.CheckLoginInterceptor"> </bean> </mvc:interceptor> </mvc:interceptors> </beans>