Spring MVC 實現登錄攔截認證

1.Controller 

@Controller
@RequestMapping
public class LoginController {

    @RequestMapping(value = "/login",method = RequestMethod.GET)
    public ModelAndView index(){
        return new ModelAndView("login");
    }


    @RequestMapping(value = "/login",method = RequestMethod.POST)
    public ModelAndView login(HttpSession session,String eMail,String passWord){
        ModelAndView mav = new ModelAndView("login");
        if(eMail!=null&&passWord!=null&&eMail.equals("[email protected]")&&passWord.equals("123456")){
            session.setAttribute("eMail",eMail);
            mav.setViewName("a");
        }
        mav.addObject("sys_time",System.currentTimeMillis());
        return mav;
    }
}

2.html

<#import "layout/spring.ftl" as spring/>
<!doctype html>
<html lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>Login</title>
    <link rel="stylesheet" href="<@spring.contextpath/>/css/style.css">
</head>
<body>
<div class="loginform cf">
    <form name="to_login" action="<@spring.contextpath/>/login" method="post" accept-charset="utf-8">
        <ul>
            <li>
                <label for="usermail">Email</label>
                <input type="email" name="eMail" placeholder="[email protected]" required>
            </li>
            <li>
                <label for="password">Password</label>
                <input type="password" name="passWord" placeholder="password" required>
            </li>
            <li>
                <input type="submit" value="登錄">
            </li>
        </ul>
    </form>
</div>
</body>
</html>

3.web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">


    <!--加載配置文件-->
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>
            classpath:spring-*.xml
        </param-value>
	</context-param>
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>


    <!-- 防止spring內存溢出監聽器 -->
    <listener>
        <listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
    </listener>


    <!--配置spring框架的Servlet-->
	<servlet>
		<servlet-name>appServlet</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>classpath:servlet-context.xml</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>
    <servlet-mapping>
        <servlet-name>appServlet</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>


    <!--攔截請求進行字符編碼轉換-->
    <filter>
        <filter-name>SetCharacterEncoding</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>SetCharacterEncoding</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <!-- 設置session超時時間-->
    <session-config>
        <session-timeout>10</session-timeout>
    </session-config>

    <welcome-file-list>
        <welcome-file>views/login.ftl</welcome-file>
    </welcome-file-list>
</web-app>

4.springmvc.xml

<?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"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:util="http://www.springframework.org/schema/util"
       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
       http://www.springframework.org/schema/util
       http://www.springframework.org/schema/util/spring-util.xsd">
    <!-- 添加註解驅動 -->
    <context:annotation-config/>

    <!-- 自動掃描該包,使SpringMVC認爲包下用了@controller註解的類是控制器 -->
    <context:component-scan base-package="com.biometrics.controller"/>

    <!-- 對靜態資源的訪問 -->
    <mvc:resources mapping="/resources/**" location="/WEB-INF/"/>
    <mvc:resources location="/static/" mapping="/**"/>


    <!-- jsp視圖解析器  -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
          p:prefix="/WEB-INF/views/"
          p:suffix=".jsp"
          p:order="2"/>

    <!-- freeMarker視圖解析器 -->
    <bean class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver"
          p:viewClass="org.springframework.web.servlet.view.freemarker.FreeMarkerView"
          p:contentType="text/html;charset=utf-8"
          p:requestContextAttribute="request"
          p:cache="true"
          p:suffix=".ftl"
          p:order="1"/>
    <bean class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer"
          p:freemarkerSettings-ref="freemarkerSettings"
          p:templateLoaderPath="/WEB-INF/views/"/>

    <util:properties id="freemarkerSettings">
        <prop key="default_encoding">UTF-8</prop>
        <prop key="url_escaping_charset">UTF-8</prop>
        <prop key="template_update_delay">1</prop>
        <prop key="tag_syntax">auto_detect</prop>
        <prop key="whitespace_stripping">true</prop>
        <prop key="classic_compatible">true</prop>
        <prop key="number_format">0.##########</prop>
        <prop key="datetime_format">yyyy-MM-dd HH:mm:ss</prop>
        <prop key="template_exception_handler">ignore</prop>
        <prop key="object_wrapper">freemarker.ext.beans.BeansWrapper</prop>
    </util:properties>

    <!-- 配置文件上傳,如果沒有使用文件上傳可以不用配置,當然如果不配,那麼配置文件中也不必引入上傳組件包 -->
    <bean class="org.springframework.web.multipart.commons.CommonsMultipartResolver"
          p:defaultEncoding="utf-8"
          p:maxUploadSize="10485760000"
          p:maxInMemorySize="40960"/>

    <!-- 會自動註冊了validator  ConversionService  -->
    <!-- StringHttpMessageConverter編碼爲UTF-8,防止亂碼 -->
    <!-- 避免IE執行AJAX時,返回JSON出現下載文件 -->
    <mvc:annotation-driven>
        <mvc:message-converters register-defaults="true">
            <bean class="org.springframework.http.converter.StringHttpMessageConverter"
                  p:supportedMediaTypes-ref="supportedMediaTypes">
                <constructor-arg value="UTF-8"/>
            </bean>
            <bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter"
                  p:supportedMediaTypes-ref="supportedMediaTypes"/>
        </mvc:message-converters>
    </mvc:annotation-driven>

    <util:list id="supportedMediaTypes">
        <ref bean="mediaType1"/>
        <ref bean="mediaType2"/>
    </util:list>

    <!-- 數據交互類型設定 -->
    <bean id="mediaType1" class="org.springframework.http.MediaType">
        <constructor-arg index="0" value="text"/>
        <constructor-arg index="1" value="plain"/>
        <constructor-arg index="2" value="UTF-8"/>
    </bean>
    <bean id="mediaType2" class="org.springframework.http.MediaType">
        <constructor-arg index="0" value="*"/>
        <constructor-arg index="1" value="*"/>
        <constructor-arg index="2" value="UTF-8"/>
    </bean>


    <!-- 攔截器 -->
    <mvc:interceptors>
        <!-- 多個攔截器,順序執行 -->
        <mvc:interceptor>
            <mvc:mapping path="/*"/>
            <bean class="com.biometrics.common.interceptor.LoginInterceptor">
               <property name="adminLoginUrl" value="login"/>
               <property name="frontLoginUrl" value="login"/>
            </bean>
        </mvc:interceptor>
    </mvc:interceptors>
</beans>

5.LoginInterceptor

package com.biometrics.common.interceptor;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

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

/**
 * Created by static on 2017/4/13.
 * 登錄認證攔截器
 */
public class LoginInterceptor extends HandlerInterceptorAdapter {

    private String adminLoginUrl;
    private String frontLoginUrl;

    /**
     * Handler執行完成之後調用這個方法
     */
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response,
                                Object handler, Exception exc) throws Exception {
    }

    /**
     * Handler執行之後,ModelAndView返回之前調用這個方法
     */
    public void postHandle(HttpServletRequest request, HttpServletResponse response,
                           Object handler, ModelAndView modelAndView) throws Exception {
    }

    /**
     * Handler執行之前調用這個方法
     */
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
                             Object handler) throws Exception {
        //獲取請求的URL
        String url = request.getRequestURI();
        //URL:login是公開的;其它的URL都進行攔截控制
        if (url.indexOf(adminLoginUrl) >= 0) {
            return true;
        }
        //獲取Session
        HttpSession session = request.getSession();
        String username = (String) session.getAttribute("eMail");

        if (username != null) {
            return true;
        }
        //不符合條件的,跳轉到登錄界面
        request.getRequestDispatcher(frontLoginUrl).forward(request, response);
        return false;
    }



    public void setAdminLoginUrl(String adminLoginUrl) {
        this.adminLoginUrl = adminLoginUrl;
    }

    public void setFrontLoginUrl(String frontLoginUrl) {
        this.frontLoginUrl = frontLoginUrl;
    }
}














發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章