错误描述:
org.directwebremoting.dwrp.BaseDwrpHandler - A request has been denied as a potential CSRF attack.
org.directwebremoting.dwrp.BaseCallHandler - Exception while processing batch
java.lang.SecurityException: CSRF Security Error
at org.directwebremoting.dwrp.BaseDwrpHandler.checkNotCsrfAttack(BaseDwrpHandler.java:85)
at org.directwebremoting.dwrp.BaseCallHandler.handle(BaseCallHandler.java:76)
at org.directwebremoting.servlet.UrlProcessor.handle(UrlProcessor.java:120)
at org.directwebremoting.servlet.DwrServlet.doPost(DwrServlet.java:141)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.struts2.dispatcher.ActionContextCleanUp.doFilter(ActionContextCleanUp.java:99)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:261)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process (Http11Protocol.java:581)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Thread.java:619)
解决办法:
修改 web.xml ?DWR 配置信息
?
<servlet>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class>org.directwebremoting.spring.DwrSpringServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
</servlet>
加入跨域调用配置信息(U色部分)Q修改ؓ:
<servlet>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class>org.directwebremoting.spring.DwrSpringServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>crossDomainSessionSecurity</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>allowScriptTagRemoting</param-name>
<param-value>true</param-value>
</init-param>
</servlet>
我刚q入金融行业Ӟq道了IS08583报文协议Q我惛_能我q没q入q个行业都已l听q了Q可知ISO8583的媄响力有多大了。最初刚接触它时Q确实对其中的一些细节概念不是很清晰Q对有些地方比较qh。鉴于此Q我惛_多同行也必然会经历同样得阶段Q所以我写下本文Q以便大家能够少C些弯路。同Ӟ我在|上Q?/span> http://blog.csdn.net/lysheng/archiv.../03/309914.aspx Q写下我要写“全面掌握ISO8583报文”?#8220;W合CEN/XFSQ即WOSA/XFSQ规范的SP~写”两篇文章Ӟ很多人都询问我什么时候能够写出来Q可知许多h是需要了解这斚w的知识的Q即使我旉不是很多Q也得尽量将q两文章写出来Q给需要的人提供一些参考?br />
如果单纯的讲IS08583那些字段的定义,我觉得没有什么意思,标准中已l对每个字段解释的非常详l了Q如果你觉得理解英文版的ISO8583规范有些困难Q网上也有同行ؓ我们译好的中文版ISO8583规范Q所以我的目的是辑ֈ阅读本文后能够对ISO8583知其Ӟ亦知其所以然Q以前基本没有接触它的Z能够辑ֈ掌握ISO8583报文规范?/span>
q期在做的S2SH目Q因为多处用到分,BOSS要求弟其抽象出来。小弟不才,实际参与开发的l验也就1q?br /> 于是׃Ҏ间将其做成自定义标签供所有需要分늚业务调用。小l一下,供新手参?/span>
自定义标{用如下:
JSP面引入Q?br />
<%@ taglib uri="/htdz-tag" prefix="htdz-tag"%>
在需要摆攄늚相关按钮处用:
<htdz-tag:PagerTag pagesize="${pagesize}" rowcount="${rowcount}" currpagenum="${currpagenum}" action="${action}"/>
以下介绍如何自定义标{:
1.首先是针对自定义标签的描qͼ
创徏WEB-INF/tags/htdz-tag.tld标签描述文gQ?br />
<?xml version="1.0" encoding="UTF-8" ?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
version="2.0">
<description>htdz tag</description>
<display-name>htdz tag</display-name>
<tlib-version>1.0</tlib-version>
<short-name>htdz-tag</short-name>
<uri>/htdz-tag</uri>
<tag>
<!--分页控g使用说明Q?br />
1.最全参数用法:<htdz-tag:PagerTag pagesize="${pagesize}" rowcount="${rowcount}" currpagenum="${currpagenum}" action="${action}" className="button_small"/>
1.最参数用法Q?lt;htdz-tag:PagerTag pagesize="${pagesize}" rowcount="${rowcount}" currpagenum="${currpagenum}" action="${action}"/>
参数说明Q?br />
1. pagesize为每记录数(必写)
2. rowcount为总记录数(必写)
3. currpagenum为当前页?必写)
4. className为分|钮样式,如果不写Q则为默认样?br />
5. action为URLh路径(必写)
-->
<description>分页控g</description>
<!--JSP里用时的标{-->
<name>PagerTag</name>
<!--用以自定义标签解析成控件的Javac?->
<tag-class>com.htdz.util.tag.PagerTag</tag-class>
<body-content>JSP</body-content>
<!--每个attribute代表标签的一个属?->
<attribute>
<description>pagesize:每页条数</description>
<!--属性名-->
<name>pagesize</name>
<!--是否必填属?->
<required>true</required>
<!--此属性值是否接受EL,<%= 之类的Ş?->
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<description>rowcount:总记录数</description>
<name>rowcount</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<description>currpagenum:当前|</description>
<name>currpagenum</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<description>action:URLh路径</description>
<name>action</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<description>className:用于客户端确定分|钮的样式</description>
<name>className</name>
<required>false</required>
</attribute>
</tag>
</taglib>
2.创徏用于标{解析ؓ面页控g的类
PagerTag.java
public class PagerTag extends TagSupport {
public static final int USER_PAGESIZE = 5;// C品搜烦--每页记录?br />
private static final String DEFAULT_BUTTON_CLASS= "button_small"; //页按钮默认样式
private static final String DISABLE_BUTTON_CLASS= "button_small_disable"; //失效按钮默认样式
private int pagesize;
private int rowcount;
private int currpagenum;
private String action;
private String className;
public PagerTag() {
}
public void setPagesize(int pagesize) {
this.pagesize = pagesize;
}
public void setRowcount(int rowcount) {
this.rowcount = rowcount;
}
public void setCurrpagenum(int currpagenum) {
this.currpagenum = currpagenum;
}
public void setClassName(String className) {
this.className = className;
}
public void setAction(String action) {
this.action = action;
}
public int doStartTag() throws JspException {
if (new Integer(pagesize) == null) {
throw new JspException("PagerTag标签中缺乏pagesize属性!");
}else if(pagesize==0){
throw new JspException("PagerTag标签中的pagesize属性无|");
}
if (new Integer(rowcount) == null) {
throw new JspException("PagerTag标签中缺乏rowcount属性!");
}
if (new Integer(currpagenum) == null) {
throw new JspException("PagerTag标签中缺乏currpagenum属性!");
}
if (action == null) {
throw new JspException("PagerTag标签中缺乏action属性!");
}else if(action.length()==0){
throw new JspException("PagerTag标签中的action属性无|");
}
//如果面标签中没写className属性,则让页按钮应用默认的按钮样?br />
if(className==null||className.length()==0){
className = DEFAULT_BUTTON_CLASS;
}
//获取总页?br />
int totalpagesize = getTotalpagesize(rowcount);
//用以标志是否能上?br />
boolean noUp = false;
//用以标志是否能下?br />
boolean noDown = false;
//声明应用?首页'Q?上一?按钮的样?因ؓ此俩按钮要么同时失效Q要么同时可?
String buttonClass1 = className;
//声明应用?下一?Q?N'按钮的样?同上)
String buttonClass2 = className;
//如果无记录,则设|总页C当前|都ؓ1
if(rowcount==0){
currpagenum = 1;
totalpagesize = 1;
}
//如果当前|W一?br />
if(currpagenum==1){
noUp = true;
//讄'首页'Q?上一?按钮失效样式
buttonClass1 = DISABLE_BUTTON_CLASS;
}
//如果当前|最大页
if(currpagenum==totalpagesize){
noDown = true;
//讄'下一?Q?N'按钮失效样式
buttonClass2 = DISABLE_BUTTON_CLASS;
}
try {
StringBuffer html = new StringBuffer();
html.append(currpagenum+"/"+totalpagesize+"?);
html.append("<input class="+buttonClass1+" type=\"button\" value=\"首页\" onclick=\"turnPage('first','"+currpagenum+"','"+totalpagesize+"','"+action+"')\" ");
if(noUp){
html.append("disabled=\"true\"");
}
html.append("/>");
html.append("<input class="+buttonClass1+" type=\"button\" value=\"上一\" onclick=\"turnPage('up','"+currpagenum+"','"+totalpagesize+"','"+action+"')\" ");
if(noUp){
html.append("disabled=\"true\"");
}
html.append("/>");
html.append("<input class="+buttonClass2+" type=\"button\" value=\"下一\" onclick=\"turnPage('down','"+currpagenum+"','"+totalpagesize+"','"+action+"')\"");
if(noDown){
html.append("disabled=\"true\"");
}
html.append("/>");
html.append("<input class="+buttonClass2+" type=\"button\" value=\"N\" onclick=\"turnPage('last','"+currpagenum+"','"+totalpagesize+"','"+action+"')\" ");
if(noDown){
html.append("disabled=\"true\"");
}
html.append("/>");
html.append(currpagenum+"/"+totalpagesize+"?amp;nbsp; ");
html.append("<input type=\"text\" maxlength=\"3\" id=\"text\" size=\"3\" onkeypress=\"return checkInput(event);\" />?);
html.append("<input class="+className+" type=\"button\" value=\"GO\" onclick=\"turnPage('to','"+currpagenum+"','"+totalpagesize+"','"+action+"')\" />");
pageContext.getOut().println(html.toString());
} catch (Exception e) {
throw new JspException(e.getMessage());
}
return this.SKIP_BODY;
}
/**
* Ҏ总记录数得到总页?br />
*
* @param rowcount
* 总记录数
* @return 总页?br />
*/
public int getTotalpagesize(int rowcount) {
int totalpagesize = 0;
if (rowcount % pagesize == 0) {
totalpagesize = rowcount / pagesize;
} else {
totalpagesize = rowcount / pagesize + 1;
}
return totalpagesize;
}
}
到此为止Q自定义标签书已完成?br /> 可应用于目各处Q?br /> 只要面上遵循标{描q规则,后台该给标签属性传值的时候记得传p了?br /> 以下用一个简单的例子来说明一下,U色字体昄的部分别忘记写就行了?/span>
UserAction.java:
public class UserAction extends ActionSupport {
private UserService userService;
private List<User> users;
public String findUser(){
String str = null;
HttpServletRequest request = ServletActionContext.getRequest();
Map sessionMap = ActionContext.getContext().getSession();
String currpagenum= "1";
try {
String pagenum = request.getParameter("pagenum ");
if(pagenum != null && pagenum .length()!=0){
currpagenum= pagenum ;
}
} catch (Exception e) {
}
//查询用户记录
users= userService.findUser(pageNum);
if(users.size!=0){
request.setAttribute("users", users);
int rowcount = userService.getCount();
request.setAttribute("rowcount ",rowcount );
request.setAttribute("currpagenum",currpagenum);
str = "success";//成功视图
}else{
message = "无记?"
str = "failure";//p|视图
}
request.setAttribute("pagesize", PagerTag.USER_PAGESIZE);
request.setAttribute("action", "findUser.action);
//q回视图
return str;
}
public UserService getUserService() {
return userService;
}
public void setUserService(UserService userService) {
this.userService = userService;
}
public List<User> getUsers(){
return users;
}
public void setUsers(List<User> users){
this.users = users;
}
}
UserService.java:
public class UserService {
private UserDao userDao;
public List<User> findUser(String pageNum){
List<User> userList = userDao.findUser(pageNum);
return userList;
}
public int getCount(){
int count = userDao.getCount();
return count;
}
public UserDao getUserDao() {
return userDao;
}
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
}
UserDao.java:
public class UserDao extends HibernateDaoSupport {
/**
* 查询用户
* @return User对象集合
*/
public List<User> findUser(String pagenum) {
List<User> users = null;
Session session = null;
try {
int myPagenum= Integer.parseInt(pagenum);
String hql = "from User";
session = this.getSession();
Query query = session.createQuery(hql);
query.setFirstResult(Pager.USER_PAGESIZE * (myPagenum - 1));
query.setMaxResults(Pager.USER_PAGESIZE);
users = query.list();
session.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (session != null) {
session.close();
}
}
return users;
}
/**
* 获取用户总记录数
* @return 用户总记录数
*/
public int getCount(){
String hql ="select count(id) from User";
Session session = null;
int count =0;
try {
session = this.getSession();
Query query = session.createQuery(hql);
List list = query.list();
session.flush();
count = Integer.parseInt(list.get(0).toString());
} catch (Exception e) {
e.printStackTrace();
} finally{
session.close();
}
return count;
}
}