欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

防止未登錄用戶操作—基于struts2攔截器的簡單實(shí)現(xiàn)

 更新時(shí)間:2017年10月11日 10:06:04   作者:逐兔郎  
下面小編就為大家?guī)硪黄乐刮吹卿浻脩舨僮鳌趕truts2攔截器的簡單實(shí)現(xiàn)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

一般,我們的web應(yīng)用都是只有在用戶登錄之后才允許操作的,也就是說我們不允許非登錄認(rèn)證的用戶直接訪問某些頁面或功能菜單項(xiàng)。我還記得很久以前我的做法:在某個(gè)jsp頁面中查看session中是否有值(當(dāng)然,在用戶登錄邏輯中會(huì)將用戶名或者用戶對象存入session中),如果session中用戶信息為空,那么redirect 到登錄頁面。然后在除了登錄頁面外的其它所有需要驗(yàn)證用戶已登錄的頁面引入這個(gè)jsp 。

比如,我們將檢查用戶是否登錄的代碼放入一個(gè)jsp頁面中,如 checkUser.jsp

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
 Object username = session.getAttribute("username");
 if(null == username){
	 
	 response.sendRedirect("login.jsp");
 }
%>

登錄頁面為 login.jsp

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
 <head>
 <title>登錄頁面</title>

 </head>
 
 <body>
 <h1>用戶登錄</h1>
        用戶名:<input type="text" name="username" /><br />
        密碼:<input type="text" name="pwd" />
 </body>
</html>

假設(shè)登錄成功后跳轉(zhuǎn)到菜單頁面 menu.jsp

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
 <head>
 <%@ include file="checkUser.jsp" %>
 <title>菜單頁</title>
 </head>
 
 <body>
 <h1>菜單1</h1> <br />
 <h1>菜單2</h1> <br />
 <h1>菜單3</h1> <br />
 <h1>菜單4</h1> <br />
 </body>
</html>

在其中引入了 checkUser.jsp ,這樣當(dāng)用戶沒有經(jīng)過登錄而試圖訪問menu.jsp 頁面時(shí)就會(huì)被強(qiáng)制轉(zhuǎn)到 login.jsp 頁面。

以上這種方法當(dāng)然是可行的,可是太過丑陋和麻煩。后來,我學(xué)到可以把除了登錄頁面外的 jsp 或html 頁面放到 WEB-INF 目錄下, 這樣用戶就無法直接在瀏覽器中敲url 來訪問頁面了。可是,如果有人通過某種方式得知我們的action 名和方法名了呢?難道我們要在action的每個(gè)方法中,檢查用戶是否登錄嗎?這樣子做光是想一想就覺得很蠢。好在我們有struts2 攔截器。

先來看看怎樣實(shí)現(xiàn)。

我們寫一個(gè)攔截器類,讓它繼承 MethodFilterInterceptor。

/** 
 * @Title: LoginInterceptoe.java
 * @Description: 攔截非登錄用戶請求
 * @author ThinkPad
 * @version 1.0
 * @date 2014年8月2日
 */
package com.exam.interceptor;

import com.exam.utils.Constants;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;

/**
 * @author ThinkPad
 *
 */
public class LoginInterceptor extends MethodFilterInterceptor{

	/**
	 * 
	 */
	private static final long serialVersionUID = -4409507846064552966L;


	/* (non-Javadoc)
	 * @see com.opensymphony.xwork2.interceptor.MethodFilterInterceptor#doIntercept(com.opensymphony.xwork2.ActionInvocation)
	 */
	@Override
	protected String doIntercept(ActionInvocation invoker) throws Exception {
		// TODO Auto-generated method stub

		Object loginUserName = ActionContext.getContext().getSession().get(Constants.USERNAME);
		if(null == loginUserName){
			return Constants.VIEW_LOGIN; // 這里返回用戶登錄頁面視圖
		}
		return invoker.invoke();
	}

}

在struts.xml 文件中 填入:

 <interceptors>
	  <interceptor name="loginInteceptor" class="com.exam.interceptor.LoginInterceptor" />
	  <interceptor-stack name="loginStack">
	    <interceptor-ref name="loginInteceptor">
	     <param name="excludeMethods">goLogin,login</param>
	    </interceptor-ref>
	    <interceptor-ref name="defaultStack"></interceptor-ref>
	  </interceptor-stack>
</interceptors>
	
<default-interceptor-ref name="loginStack" />

其中,<param name="excludeMethods">goLogin,login</param> 配置的過濾方法,意思是攔截器對其中的方法不起作用。在我這里, goLogin 是跳轉(zhuǎn)到登錄頁面的方法。login 是驗(yàn)證用戶名和密碼的方法,在其中會(huì)將通過驗(yàn)證的用戶名放入session中。沒錯(cuò),這就是我們需要做的全部事情了,是不是很方便呢?

我在這里稍微總結(jié)下:

1、在struts2 中,所有的攔截器都會(huì)繼承 Interceptor 這個(gè)接口。

2、攔截器寫好之后要在 struts.xml 文件中配置,如果該攔截器是用來攔截某個(gè)action的,那么,就在該action 的result 后面放入該攔截器。

<struts>&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp; <package&nbsp;name="struts2"&nbsp;extends="struts-default">&nbsp; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <interceptors>&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <interceptor&nbsp;name="myinterceptor"&nbsp;class="com.interceptor.MyInterceptor">&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <param&nbsp;name="hello">world</param>&nbsp; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </interceptor>&nbsp; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </interceptors>&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <action&nbsp;name="register"&nbsp;class="com.test.action.RegisterAction"&nbsp;>&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <result&nbsp;name="input">/register.jsp</result>&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <result&nbsp;name="success">/success.jsp</result>&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <interceptor-ref&nbsp;name="myinterceptor"></interceptor-ref>&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </action>&nbsp; 
&nbsp;&nbsp;&nbsp;&nbsp; </package>&nbsp;&nbsp; 
&nbsp;<struts>&nbsp;

3、如果我們沒有添加攔截器,struts2 會(huì)為我們添加默認(rèn)攔截器。而如果我們指定了攔截器,我們自己的攔截器就會(huì)取代默認(rèn)的攔截器,那么我們就不能享受默認(rèn)攔截器提供的一些功能。所以,一般我會(huì)把默認(rèn)攔截器也加上。例如,在以上配置項(xiàng)中,action 里面再加上<interceptor-ref name="defaultStack"></interceptor-ref>

4、Interceptor 接口有三個(gè)方法:init 、 destroy、intercept 。但一般我們不關(guān)心 init 和 destroy 方法。所以struts2 為我們提供了一個(gè)簡化的攔截器類:AbstractInterceptor ,它實(shí)現(xiàn)了init 和 destroy 方法,我們只需實(shí)現(xiàn) intercept 方法。

5、關(guān)于攔截器棧??梢园褦r截器??闯墒且粋€(gè)“大”攔截器,里面由若干個(gè)攔截器組成。把它當(dāng)成一個(gè)攔截器一樣的引用。

6、方法過濾攔截器,需要繼承 MethodFilterInterceptor 類(也就是我們這里示例使用的攔截器類的做法)。你可以指定該攔截器攔截哪些方法(使用<param name="includeMethods">method1,method2</param>
),也可以指定該攔截器不去攔截哪些方法(<param name="excludeMethods">method1,method2</param>)

以上這篇防止未登錄用戶操作—基于struts2攔截器的簡單實(shí)現(xiàn)就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringBoot?整合?ShardingSphere4.1.1實(shí)現(xiàn)分庫分表功能

    SpringBoot?整合?ShardingSphere4.1.1實(shí)現(xiàn)分庫分表功能

    ShardingSphere是一套開源的分布式數(shù)據(jù)庫中間件解決方案組成的生態(tài)圈,它由Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar(計(jì)劃中)這3款相互獨(dú)立的產(chǎn)品組成,本文給大家介紹SpringBoot?整合?ShardingSphere4.1.1實(shí)現(xiàn)分庫分表,感興趣的朋友一起看看吧
    2023-12-12
  • java之swing單選框用法實(shí)例分析

    java之swing單選框用法實(shí)例分析

    這篇文章主要介紹了java之swing單選框用法,以實(shí)例形式分析了swing圖形界面單選框的實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-09-09
  • Java自定義長度可變數(shù)組的操作

    Java自定義長度可變數(shù)組的操作

    這篇文章主要介紹了Java自定義長度可變數(shù)組的操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • Java基于drools做規(guī)則校驗(yàn)的實(shí)現(xiàn)

    Java基于drools做規(guī)則校驗(yàn)的實(shí)現(xiàn)

    工作中需要開發(fā)一個(gè)規(guī)則服務(wù),提供各種規(guī)則,本文主要介紹了Java基于drools做規(guī)則校驗(yàn)的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03
  • Java構(gòu)造器使用方法及注意事項(xiàng)

    Java構(gòu)造器使用方法及注意事項(xiàng)

    這篇文章主要介紹了Java構(gòu)造器使用方法及注意事項(xiàng)的相關(guān)資料,這里舉例說明如何使用構(gòu)造器及需要注意的地方,需要的朋友可以參考下
    2017-07-07
  • spring-boot 禁用swagger的方法

    spring-boot 禁用swagger的方法

    本篇文章主要介紹了spring-boot 禁用swagger的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-02-02
  • Mybatis中的自定義映射resultMap

    Mybatis中的自定義映射resultMap

    在MyBatis中,自定義映射resultMap可以讓你精確控制如何將數(shù)據(jù)庫返回的結(jié)果集映射到Java對象上,本文給介紹了Mybatis之自定義映射resultMap,需要的朋友可以參考下
    2024-03-03
  • java 各種數(shù)據(jù)類型的互相轉(zhuǎn)換實(shí)例代碼

    java 各種數(shù)據(jù)類型的互相轉(zhuǎn)換實(shí)例代碼

    這篇文章主要介紹了java 各種數(shù)據(jù)類型的互相轉(zhuǎn)換實(shí)例代碼,需要的朋友可以參考下
    2020-10-10
  • RabbitMQ冪等性與優(yōu)先級及惰性詳細(xì)全面講解

    RabbitMQ冪等性與優(yōu)先級及惰性詳細(xì)全面講解

    關(guān)于MQ消費(fèi)者的冪等性問題,在于MQ的重試機(jī)制,因?yàn)榫W(wǎng)絡(luò)原因或客戶端延遲消費(fèi)導(dǎo)致重復(fù)消費(fèi)。使用MQ重試機(jī)制需要注意的事項(xiàng)以及如何解決消費(fèi)者冪等性與優(yōu)先級及惰性問題以下將逐一講解
    2022-11-11
  • 學(xué)生視角帶你了解Java內(nèi)部類

    學(xué)生視角帶你了解Java內(nèi)部類

    說起內(nèi)部類這個(gè)詞,想必很多人都不陌生,但是又會(huì)覺得不熟悉。原因是平時(shí)編寫代碼時(shí)可能用到的場景不多,用得最多的是在有事件監(jiān)聽的情況下,并且即使用到也很少去總結(jié)內(nèi)部類的用法。今天我們就來一探究竟
    2022-03-03

最新評論