TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
Sturts2漏洞百出,可谓是年年都会爆发一次或大或小的风波,但是即使这样,Sturts2还是有一批用户的。
0 H% H1 w6 |% v3 d1 m花费十几分钟,简单的搭建实现了一下基本的登录功能。都是入门级的,高手肯定是不屑了,但是对于初次涉猎的小白们,还是可以提供点参考的。
- s$ |1 H# M" G9 n0 ]; C) K
" O7 |1 `, n9 [9 \ W& @注意:
! P) Y6 ]; O& @+ M0)项目Demo可以正常运行并经过测试
6 B# x3 V) j$ a% w D1)代码是伪代码,自行添加逻辑
0 }" k: s! y& j: `: h7 B. }2)struts2-2.5.10 加入了Action验证,注意 struts.xml 中的 <global-allowed-methods>regex:.*</global-allowed-methods>
; n% ~: F! ~# a1 Y3)struts2-2.5.10 拦截器修改了路径,注意web.xml中的配置
0 R' P, s6 ? ~; L% I# k$ Y4)本案例,返回采用json数据的形式,使用struts2-json-plugin-2.3.20.jar,json配置见struts.xml 全局配置。
+ F* _, z0 D* T4 K, M1 A0 d. f* Z8 j5 K7 P! ]9 [3 M
一、项目搭建(使用最新版本struts2-core-2.5.10)& ^+ ?% N0 O0 S5 @& \
4 ^, ?4 Z6 q& U0 E/ G
1、相关JAR
; l! S8 I. b; qcommons-fileupload-1.3.2.jar9 f* j* Y0 m+ h+ d# d( y( D4 c
commons-io-2.4.jar; Q- E& S/ t4 \1 X
commons-lang3-3.4.jar7 o. }! ~8 A! ]3 A
commons-logging-1.2.jar
; C2 t9 R6 r, O$ K6 sfreemarker-2.3.23.jar
2 n# G/ s, _* N3 Z( F2 s: Xjavassist-3.20.0-GA.jar
& [, R& x: }' flog4j-api-2.7.jar6 |. \& \# F. T5 Y. p
log4j-core-2.7.jar
$ m' Y8 n8 r" Xognl-3.1.12.jar
4 o: p4 E& l1 }struts2-core-2.5.10.jar& P+ j2 \2 W* a9 H( d
struts2-json-plugin-2.3.20.jar
# b" B" r+ \: I0 d, C+ l" m/ Yxwork-core-2.3.31.jar$ K; A; s1 A0 G" [" P
2 y" i" i) M6 @. h' e- b3 [4 X
2、前端框架, q3 ^# R( B1 z* V
Jqueryjquery-1.10.2.min.js
: ]; `, p L& t& L+ n" `; a6 C% qbootstrap.min.js
) f# u: t; ]4 i& r$ u& b( Q; j2 i
8 v) O9 u/ B0 w" C3、相关配置:
/ s* J8 Z+ l3 V( w. r6 |8 ]9 d8 Gweb.xml
. u. Y% C: m: ?2 V! f- <?xml version="1.0" encoding="UTF-8"?>" d4 W) ?3 h4 R( g2 j. ]* K
- <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5" >
0 Y9 k% z3 z, H6 A2 I2 h% z7 K5 K - <display-name>struts2</display-name>
/ I$ x8 U0 p- @) U; V - <!-- struts2配置 -->
& Z# o% O0 H% V0 Y - <filter>9 f0 s, ~6 A! e: j; \
- <filter-name>struts2</filter-name>
: ^" n& g- w4 g# X% H' N - <filter-class>, B! d' @: Q6 L) ]$ ~4 I
- org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter
" X" f0 I( _ [" J+ l# x9 b4 i4 V - </filter-class>* M1 p# h; n/ W, [7 ?
- </filter>! u4 E8 N: |- c9 C: k8 Z1 D D
- <filter-mapping>) L& b# F* q7 [2 a6 P A6 m; f& h
- <filter-name>struts2</filter-name>
' J4 H/ h0 v! Z- ~1 |9 q - <url-pattern>/*</url-pattern>7 D* b, n% ]% i
- </filter-mapping>) d3 w+ @& S* D0 `4 q$ [# b
- <welcome-file-list>
$ f3 N# b P) p6 y - <welcome-file>login.jsp</welcome-file>
& |( F" O+ V6 S- {3 k - </welcome-file-list>
6 F6 U6 a u2 o% ~, W - </web-a
复制代码
5 k% f. D! A3 Q8 dstruts.xml/ `* s$ {- ~ T/ H- _
- <?xml version="1.0" encoding="UTF-8" ?>
0 s$ b: ~! n( ?4 Q. n3 w - <!DOCTYPE struts PUBLIC- V/ M9 H6 ^1 J' p- B, q& R
- "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
# D% d2 M! y% Z - "http://struts.apache.org/dtds/struts-2.5.dtd">
3 O' A' O! T7 J% ?( N - <struts>
8 `) B% q; x" `1 C5 A - <!-- struts配置文件改动后,是否重新加载 -->
$ k e2 F5 b$ ? - <constant name="struts.configuration.xml.reload" value="true" />
8 P0 _" @3 i5 V, v: h# j6 I - <!-- 开发模式 开启它则默认开启了i18n.reload、configuration.xml.reload 上线后要关闭此选项 -->3 b7 k) E* O \. a7 ^% p) }2 z
- <constant name="struts.devMode" value="false" />! S4 f% c" i* \; E8 G( d6 ~ F
- <constant name="struts.i18n.encoding" value="UTF-8"/>
9 R% R: G7 B; S - <constant name="struts.multipart.maxSize" value="1073741824"/><!-- 上传文件最大值 -->
3 w: ?& c2 Q! I& V5 f - <constant name="struts.custom.i18n.resources" value="config" />
: Z" S- d. c$ x7 T/ r; Q - <constant name="struts.action.extension" value="action"/>
3 }+ p5 V+ s2 `0 M, ~/ c8 J - <package name="struts-global" extends="json-default">/ t& u" `$ m& W) W) Y( }7 B* }
- <!-- 配置Json输出 配合使用 struts2-json-plugin-2.3.20.jar 后台配置 message -->
) P& \0 P( P! _2 f2 |. K& I8 ? - <global-results> $ G+ N9 `, Z V6 f
- <result type="json">0 `: O3 ^5 W0 m! `, \- r
- <param name="root">message</param>0 z* g5 d+ ^( R7 P6 X5 F
- </result>
! v1 T& _ g* y9 p3 M - </global-results>
7 C* y. e* c! s3 ?! p! Y - <!-- 2.5.10版本 匹配 -->7 ^5 L7 O( y+ i+ o8 r
- <global-allowed-methods>regex:.*</global-allowed-methods>
1 V8 a6 S2 N* J. |3 f - </package>0 I! p% e- G$ A( t
- <package name="user" extends="struts-global">3 c! J1 X, ^8 d& v% h
- <action name="userAction_*" class="com.itstyle.web.user.UserAction" method="{1}">
0 I2 }2 { k: t t& t - <result name="logout">/login.jsp</result>
) R: ^4 c8 X# L e* v' c9 u: d5 { - </action>
6 i o2 K0 g% y; S1 s - </package> `" l. r; y8 H& E
- </struts>
9 ]1 L+ _1 ?: G X+ w7 V8 l - 2 y ~9 a$ {7 s t' H5 ^
复制代码
4 e" i e S6 g& P6 n1 w
+ g; c2 B" S6 T4 [0 u3 a ?UserAction
" s5 ^. j* F) f' O, L7 I8 g1 h/ I- package com.itstyle.web.user;
7 O8 P/ \0 h: u
1 B2 K1 \# h# F P4 S- import com.opensymphony.xwork2.ActionSupport;% W0 p$ b9 n2 W7 a. J3 W* i
- /** M$ m) N$ D9 g7 V) H2 [
- *
1 f, Z+ t1 b6 u' B& o1 F) a - * @author 科帮网4 o) o% W( [! |- f6 v$ C
- *1 g3 T- q$ u& h$ ?3 c& {& H
- */) V% C9 Z* K. l! `9 T$ z/ R6 l: ^
- public class UserAction extends ActionSupport {9 f% s; K B2 T. K5 ?+ i/ D5 Z' ~/ P3 [
- private static final long serialVersionUID = 1L;. @4 X- j. {* f: k1 q' B4 Y
- private String message;
+ M+ ~3 y3 f" ]/ \7 x! p1 T4 `5 t+ l - private String userName; t& e: e& p6 U
- private String password;/ _( k( g# I; R! a
- ( E1 O* K+ i2 K$ T: L0 _3 K4 \
- public String login(){
4 {$ u( `) t3 D8 f5 ~$ d( g( ~( j m6 ` - if("admin".equals(userName)&&"admin".equals(password)){( i' U0 V. q; X
- message = "0";4 o/ D+ S: o0 g. S' D, l
- }else{
& Z h( l+ ~9 M9 Q8 d9 M - message = "1";
1 |( D# z3 M/ j2 Y8 a - }8 x; n( Z! W$ R9 U5 F! U& g/ ~
- return SUCCESS;
% @( }/ z+ H4 p, b5 t - }
( {" d" j: g# m7 B -
$ z7 S: `$ Y* n1 \) _5 R* S5 G - public void setMessage(String message) {
/ N5 v/ F2 Z/ e, }5 G - this.message = message;
' X' n7 g# G& T* e$ ^8 A+ T - }6 I4 s4 o0 A# z
- public String getMessage() {2 z; A$ w0 E# e+ A
- return message;1 E8 ^: ], [+ {7 I3 Q: Z0 z
- }
( z7 U. q$ ^$ a7 b4 `7 Z7 w
7 q' R* C" `( W1 P- public void setUserName(String userName) {
/ L1 U2 \6 H$ e. `! t: [9 @5 u# k - this.userName = userName;2 P; {# H; @ ]& q J/ |, B
- }
8 b7 J, m: g8 R7 v8 w
* l. {) R" C+ F. w. q7 V8 O- public void setPassword(String password) {
3 v1 u5 ^" S3 I& U2 G+ v7 K - this.password = password;6 X8 A4 S! U: K9 `" n: s0 V$ m. O
- }- I+ n7 @; `5 `
- }6 B& E) d& \# N& Z$ _$ d
复制代码
$ v' T# U" h& C, b6 h1 O5 Y# { b |; k V% A' N7 Y1 v5 _0 Z2 I
login.jsp
! ]; \' n' h; b+ q4 U6 m- <script>. |- E: H3 _" l( \1 {& o* ~; y# ?
- var path = '<%=basePath %>';! J2 v- W9 e: R b2 P
- function login(){8 g" k2 I% t: W2 w: r: T, u5 U$ _
- var username = $("#username").val();$ ~# R, b: K; B* C
- var password = $("#password").val();
0 s% i* O8 ^7 l - var data = {username:username,password:password};# [7 l, n0 s+ j, m
- $.ajax({
, L0 p; g6 i1 i* @3 w9 t* w0 q - type:"post",# g0 w( V( |3 ]1 N7 G7 z& C
- url:path+"userAction_login.action",
7 H7 ]" Z! z" P4 P# F - data:data,
; _/ T- |# b F! F - dataType:"json",
) c2 c6 W& ]8 E) s0 ~% W - async : false,% o2 U5 l7 ?- Q9 q$ e* o! d
- success : function(data) {
: f( _; P4 O6 l: p8 |* f - if(data==="0"){
! |5 \" v1 x, W- V7 x+ h - alert("登录成功");
& G2 D! u. t) m0 i. |3 h - window.location.href ="http://blog.52itstyle.com";7 ?: h2 J9 J. [+ T0 L. u/ m
- }else{0 }! u4 U- ^0 d' d% y3 {
- alert("登录失败");
$ h8 I3 E: P" { I+ @ - }3 X/ o- |# y! x- X
- }8 r. _; i$ O% E! E. V
- });
: L( G9 ]3 f s; m' j; O -
# F, w& w3 T8 d+ }, v/ L/ Z) | - }& C) y& c1 b6 E) P; F, B6 }6 y
- 9 c+ B# h( B) s' h" e4 K, B
- </script>
复制代码
' n% Z- q5 R: I5 f- o: h页面展示:
9 F* O4 {7 Y8 f8 Z# E' w% _0 ?3 _' `7 w& b; |
) j" p- m+ F' ^; V5 L
' U4 A( u6 \0 W
基于Sturts2实现一个简单的登录功能.txt
(64 Bytes, 下载次数: 2, 售价: 1 IT币)
4 ]& W! }0 a( x( S# J |
|