1. 程式人生 > >SpringMVC註解實現登入驗證

SpringMVC註解實現登入驗證

攔截器抽象類繼承spring的HandlerInterceptorAdapter

package com.hsr.component.auth;
import com.hsr.core.annotations.AuthAdmin;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;


public abstract class AuthAdminInterceptorDefault extends HandlerInterceptorAdapter {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        //認證使用者

        if(handler == null || !handler.getClass().isAssignableFrom(HandlerMethod.class)){
            return true;
        }

        HandlerMethod handlerMethod = (HandlerMethod) handler;
        Class beanType = handlerMethod.getBeanType();
        AuthAdmin classLevelAuthAnnotation = null;
        AuthAdmin methodLevelAuthAnnotation = null;
        if(beanType != null){
            classLevelAuthAnnotation = (AuthAdmin) beanType.getAnnotation(AuthAdmin.class);
        }
        methodLevelAuthAnnotation = handlerMethod.getMethodAnnotation(AuthAdmin.class);


        //先判斷方法級別的限制
        if(methodLevelAuthAnnotation != null){
            if(methodLevelAuthAnnotation.validate() == false){
                return true;
            }
            else{
                return _validateUser(request, response);
            }
        }

        //如果方法級別沒有註解在判斷類級別的
        if(classLevelAuthAnnotation != null){
            if(classLevelAuthAnnotation.validate() == false){
                return true;
            }
            else{
                return _validateUser(request, response);
            }
        }
        return true;
    }

    private boolean _validateUser(HttpServletRequest request,HttpServletResponse response)  throws IOException {
        //所有的請求都是要進行登陸認的
        Object obj = ensureCurrentUser(request,response);
        if(obj == null){

            //判斷請求是否是ajax請求
            String requestType = request.getHeader("X-Requested-With");
            if(requestType != null && !"".equals(requestType.trim())){
                if("XMLHttpRequest".toUpperCase().equals(requestType.toUpperCase())){
                    //getOutputStream與getWriter呼叫的問題
                    if(!response.isCommitted()) {
                        response.reset();
                    }
                    //告訴瀏覽器用UTF-8的編碼格式
                    response.setHeader("Content-type", "application/html;charset=UTF-8");
                    //是告訴servlet用UTF-8轉碼
                    response.setCharacterEncoding("UTF-8");
                    response.getWriter().write("LOGIN_TIME_OUT");
                }
            }
            else{
                response.sendRedirect(ensureRedirectLoginUrl(request,response));
            }
            return false;
        }else{
            return true;
        }
    }

    protected abstract Object ensureCurrentUser(HttpServletRequest request,HttpServletResponse response);
    protected abstract String ensureRedirectLoginUrl(HttpServletRequest request,HttpServletResponse response);
}

package com.edu.admin.base;

import com.hsr.component.auth.AuthAdminInterceptorDefault;

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

public class AdminAuth extends AuthAdminInterceptorDefault {
    @Override
    protected Object ensureCurrentUser(HttpServletRequest request, HttpServletResponse response) {
        return AdminUtil.getCurrentUser();
    }

    @Override
    protected String ensureRedirectLoginUrl(HttpServletRequest request, HttpServletResponse response) {
        return "login";
    }
}
註解程式碼
package com.hsr.core.annotations;

import java.lang.annotation.*;

/**
 認證管理端使用者
 */
@Documented
@Inherited
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface AuthAdmin {
    boolean validate() default true;
}
springmvc的xml檔案配置
<mvc:interceptors>
   <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"/>
      <mvc:interceptor>
         <mvc:mapping path="/admin/**"/>
      <bean class="com.edu.admin.base.AdminAuth"/>
   </mvc:interceptor>
</mvc:interceptors>
然後在需要驗證登入的controller上使用註解就行了



相關推薦

SpringMVC註解實現登入驗證

攔截器抽象類繼承spring的HandlerInterceptorAdapter package com.hsr.component.auth; import com.hsr.core.annotations.AuthAdmin; import org.springfra

SpringMVC攔截器實現登入驗證

Spring攔截器說明: 攔截器通過統一攔截從瀏覽器發往伺服器的請求,進行相應的處理,完成功能增強 SpringMVC攔截器是可插拔式設計,使用時,直接在配置檔案中應用該攔截器即可 使用場景:解

spring security實現登入驗證以及根據使用者身份跳轉不同頁面

想關依賴,採用session加redis儲存使用者資訊 <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security

使用自定義註解實現登入使用者獲取

業務功能場景 在程式碼程式中很多介面的呼叫會有限制,需要使用者在登入狀態下才能進行操作(需要眾多使用者的資訊等),這裡就使用註解在呼叫介面的時候進行驗證攔截。 自定義一個註解 package com.timothy.annotation; import jav

前端js實現--登入驗證二維碼

 數字和字母組合的四位驗證碼 HTML如下           <li class="border testcode">             &l

springboot+ajax實現登入驗證

1.基本思路:        前臺登入頁面form表單,用jquery設定表單提交按鈕點選事件,不考慮其他情況,理想化使用者已經輸入了使用者名稱和密碼,然後點選提交,然後呼叫ajax向後臺傳入json資料,後臺將json轉化為使用者自己設定的實體類,然後呼叫後臺函式判斷使用

【Django】Python 實現登入驗證

1 安裝 pillow 包,用於生成驗證碼圖片 程式碼檔案 verification.py #!/usr/bin/python # -*- coding: utf-8 -*- import random from PIL import Image, ImageDraw, Image

JSONP跨域訪問實現登入驗證

最近在做一個手機Web專案,硬著頭皮上了。現在比較流行的就是使用Phonegap+HTML5+CSS+JS/JQuery做一個看起來native的mobile web app。但是由於時間急,而且這些東西都不是很熟悉,再加上這只是對已有web網站的mobile化,因此採用

ssm配置完成shiro,實現登入驗證的功能

花了一天時間,算是完成了shiro登入驗證的這一基本功能。 https://www.w3cschool.cn/shiro/andc1if0.html 這個教程可以多看看,核心的基礎功能很重要。 實現shiro 第一步,引入所需要的依賴 在pom.xml檔案中加入 &

JavaWeb實現登入驗證

在登入介面中使用圖片驗證碼, 對於現在的web應用到處可見. 話不多說, 開始寫程式碼了! 首先, 新建一個JSP, 表示登入介面: login3.jsp檔案: <%-- User: menglanyingfei Date: 2018/

python實現登入驗證系統(搭建MVC框架)

小型登入註冊驗證系統 一、概述 ​ 使用Redis+MySQL資料庫實現一個小型的登入註冊驗證系統。在這個系統中初步瞭解認識MVC框架。 ​ 具備功能:登入、註冊、改密、登出。 ​ 資料庫:Redis,MySQL。使用Redis把使用者資

(一)如何使用Spring-security來實現登入驗證功能(XML配置方式)?

先從使用xml的方式來實現使用者的許可權登入 (1)需要在maven工程中加上關於spring-secutity的jar包的依賴 //spring-securityd 有關的依賴 <

java 連結資料庫實現登入驗證

因為當初比較抵觸框架,so放棄後端開發選擇了前端開發,筆記一直有保留,不是因為什麼,只是因為自己做過,曾經經歷過,也許哪一天我又重拾了呢,這都是未知數…… package example; impor

使用Ajax實現登入驗證

get提交方式: <%@ page language="java" import="java.util.*" pageEncoding="UTF-8" contentType="text/html; charset=utf-8"%> <!DOCTYPE

Django實現登入驗證功能

Django實現登入驗證功能Django實現登入驗證功能:Django對使用者登入功能已經進行了封裝,我們只需要簡單地修改就可以了。 檢視:views.py # Create your views

spring mvc+spring+mybatis+ajax實現登入驗證

<h1>Spring Mvc+Spring+Mybatis+Ajax 實現非同步登入的例子,和大家分享一下。</h1><div>login.js程式碼:</div><pre name="code" class="javas

react通過react-router-dom攔截實現登入驗證

在使用react開發專案中,有些頁面需要登入之後才能訪問,所以需要進行攔截,此處分享採用react-router-dom v4+redux+redux-saga+ant-mobile+axios技術來實現 Login.jsx import React from "reac

Android客戶端與Tomcat伺服器通訊實現登入驗證

一.功能描述   在Android客戶端實現登入介面,當將使用者名稱和密碼填入文字框並點選登入按鈕時,將認證資訊傳送至Tomcat伺服器進行認證,若使用者名稱和密碼匹配,則Android客戶端提示登入成功,否則提示登陸失敗。 二.開發環境 Android客戶端:Andro

springMVC 註解實現例項 springMVC+ajax

springMVC註解版本的工程搭建,web工程名字為:springMVC-study 1、首先在web.xml中加入springMVC的前端過濾器,DispatcherServlet.這裡的servlet-name就規定了springmvc的配置檔名字為springmvc

springMvc的安全登入驗證

1. 引入springMvc許可權框架security 1-1 配置web.xml 1. 在監聽器上引入許可權局框架的配置檔案security.xml <!--監聽器--> <listener> <li