最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

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

登錄頁(yè)面為 login.jsp

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

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

假設(shè)登錄成功后跳轉(zhuǎn)到菜單頁(yè)面 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>菜單頁(yè)</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 頁(yè)面時(shí)就會(huì)被強(qiáng)制轉(zhuǎn)到 login.jsp 頁(yè)面。

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

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

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

/** 
 * @Title: LoginInterceptoe.java
 * @Description: 攔截非登錄用戶請(qǐng)求
 * @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; // 這里返回用戶登錄頁(yè)面視圖
		}
		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> 配置的過濾方法,意思是攔截器對(duì)其中的方法不起作用。在我這里, goLogin 是跳轉(zhuǎn)到登錄頁(yè)面的方法。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è)簡(jiǎn)化的攔截器類: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攔截器的簡(jiǎn)單實(shí)現(xiàn)就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java使用FilenameFilter查找出目錄下指定后綴的文件示例

    Java使用FilenameFilter查找出目錄下指定后綴的文件示例

    這篇文章主要介紹了Java使用FilenameFilter查找出目錄下指定后綴的文件,結(jié)合實(shí)例形式分析了java基于FilenameFilter類的文件遍歷、查找相關(guān)操作技巧,需要的朋友可以參考下
    2019-10-10
  • Mybatis整合達(dá)夢(mèng)數(shù)據(jù)庫(kù)的完整步驟記錄

    Mybatis整合達(dá)夢(mèng)數(shù)據(jù)庫(kù)的完整步驟記錄

    作為國(guó)產(chǎn)數(shù)據(jù)庫(kù),達(dá)夢(mèng)做的不錯(cuò),提供的遷移工具也相當(dāng)不錯(cuò),下面這篇文章主要給大家介紹了關(guān)于Mybatis整合達(dá)夢(mèng)數(shù)據(jù)庫(kù)的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-02-02
  • springboot如何通過URL方式訪問外部資源

    springboot如何通過URL方式訪問外部資源

    這篇文章主要介紹了springboot如何通過URL方式訪問外部資源,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • SpringBoot整合Mybatis實(shí)現(xiàn)CRUD

    SpringBoot整合Mybatis實(shí)現(xiàn)CRUD

    這篇文章主要介紹了SpringBoot整合Mybatis實(shí)現(xiàn)CRUD的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-09-09
  • springboot接入cachecloud redis示例實(shí)踐

    springboot接入cachecloud redis示例實(shí)踐

    這篇文章主要介紹了springboot接入cachecloud redis示例實(shí)踐,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • java 獲取已知文件擴(kuò)展名的代碼

    java 獲取已知文件擴(kuò)展名的代碼

    java 編寫程序獲取已知文件的擴(kuò)展名. 注意: abc.txt的擴(kuò)展名是txt, abc.java.txt的擴(kuò)展名也是txt.,需要的朋友可以參考下
    2017-02-02
  • Java中replace與replaceAll的區(qū)別與測(cè)試

    Java中replace與replaceAll的區(qū)別與測(cè)試

    replace和replaceAll是JAVA中常用的替換字符的方法,下面這篇文章主要給大家介紹了關(guān)于Java中replace與replaceAll的區(qū)別與測(cè)試,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09
  • SpringLDAP目錄服務(wù)之LdapTemplate與LDAP操作方式

    SpringLDAP目錄服務(wù)之LdapTemplate與LDAP操作方式

    本文將深入探討Spring LDAP的核心概念、LdapTemplate的使用方法以及如何執(zhí)行常見的LDAP操作,幫助開發(fā)者有效地將LDAP集成到Spring應(yīng)用中,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • springMVC引入Validation的具體步驟詳解

    springMVC引入Validation的具體步驟詳解

    本文簡(jiǎn)單介紹如何引入validation的步驟,如何通過自定義validation減少代碼量,提高生產(chǎn)力,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2018-05-05
  • 解決日期轉(zhuǎn)化Json異常- Date JSON parse error

    解決日期轉(zhuǎn)化Json異常- Date JSON parse error

    這篇文章主要介紹了解決日期轉(zhuǎn)化Json異常- Date JSON parse error問題。具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06

最新評(píng)論

阿合奇县| 无棣县| 宿松县| 万全县| 平湖市| 兴仁县| 霍城县| 阳新县| 枞阳县| 新安县| 外汇| 甘肃省| 东宁县| 湘乡市| 揭西县| 文成县| 旬邑县| 永丰县| 仙桃市| 宜良县| 济源市| 冷水江市| 湖北省| 南丹县| 四会市| 景谷| 鹤峰县| 吕梁市| 鹤庆县| 稷山县| 搜索| 汝阳县| 金塔县| 青神县| 顺昌县| 巴林左旗| 宣威市| 长顺县| 崇明县| 天柱县| 大同县|