Web Service附加身份认证样例
目录:
1、wsdd配置说明。
2、读取任意目录下的wsdd配置文件。
3、添加service服务。
4、添加权限认证。
5、完整代码样例。
内容:
1、wsdd配置说明
?
<?xml version="1.0" encoding="UTF-8"?><deployment name="defaultClientConfig"xmlns="http://xml.apache.org/axis/wsdd/"xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"xmlns:handler="http://xml.apache.org/axis/wsdd/providers/handler"><globalConfiguration><!--禁止纯粹的XML请求 --><parameter name="disablePrettyXML" value="true" /><!--接受dotNet soap请求 --><parameter name="dotNetSoapEncFix" value="true" /><!--禁止名称空间前缀优化 --><parameter name="enableNamespacePrefixOptimization"value="false" /><!-- 请求处理配置 ,每一个service请求前都会调用里面的handler--><requestFlow><!-- Java Web Services 处理类 --><handler type="java:org.apache.axis.handlers.JWSHandler"><!-- 会话范围 --><parameter name="scope" value="request" /><parameter name="extension" value=".jwr" /></handler><!-- soap监控 --><handler type="java:org.apache.axis.handlers.SOAPMonitorHandler"/></requestFlow></globalConfiguration><!-- 一个特定的HTTP处理程序,通常作为HTTP的传输链,接受这样的请求如:http://localhost:8080/was/was/TicketService?wsdl --><handler type="java:org.apache.axis.handlers.http.URLMapper"name="URLMapper" /><!-- 序列化本地响应消息 --><handler type="java:org.apache.axis.transport.local.LocalResponder"name="LocalResponder" /><!-- 定义服务器端的传输,当有请求送达时启用 --><transport name="http"><parameter name="qs:list"value="org.apache.axis.transport.http.QSListHandler" /><parameter name="qs:method"value="org.apache.axis.transport.http.QSMethodHandler" /><parameter name="qs:wsdl"value="org.apache.axis.transport.http.QSWSDLHandler" /><requestFlow><handler type="URLMapper" /><handlertype="java:org.apache.axis.handlers.http.HTTPAuthHandler" /></requestFlow></transport></deployment>
2、读取任意目录下的wsdd配置文件
??? 增加servlet配置,web.xml内容如下:
<?xml version="1.0" encoding="UTF-8"?><web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <servlet><servlet-name>WasAxisServlet</servlet-name><display-name>Apache-Axis Servlet</display-name><servlet-class>org.was.servlet.WasAxisServlet</servlet-class><load-on-startup>10</load-on-startup></servlet><servlet-mapping><servlet-name>WasAxisServlet</servlet-name><url-pattern>/was/*</url-pattern></servlet-mapping></web-app>
??? 读取位于WEB-INF/conf/server-config.wsdd文件Java代码如下:
package org.was.servlet;import java.io.File;import org.apache.axis.configuration.FileProvider;import org.apache.axis.server.AxisServer;import org.apache.axis.transport.http.AxisServlet;/** * 加载自定义配置文件Servlet * * @author orientalpigeon * */public class WasAxisServlet extends AxisServlet {private static final long serialVersionUID = -7163843775902482518L;/** * 覆盖AxisServlet中的初始化AxisServer的方法,用于读取自定义webservices配置文件 */public AxisServer getEngine() {if(axisServer != null)return axisServer;String fullPath = getLocalePath() + getAxisServerConfigPath();FileProvider fileProvider = new FileProvider(fullPath);axisServer = new AxisServer(fileProvider);return axisServer;}/** * 设置axis配置文件相对路径 * @return */private String getAxisServerConfigPath(){StringBuffer relativePath = new StringBuffer();relativePath.append("WEB-INF");relativePath.append(File.separator);relativePath.append("conf");relativePath.append(File.separator);relativePath.append("server-config.wsdd");return relativePath.toString();}/** * 读取Web应用根路径 * @return */private String getLocalePath() {String contextPath = this.getServletContext().getRealPath("/");if (contextPath == null)contextPath = "";if (contextPath.endsWith("/") || contextPath.endsWith("\")) {return contextPath;}contextPath += File.separator;return contextPath;}}3、添加service服务
??? 在wsdd配置文件中增加代码如下:
<!-- 自定义 Web Services 服务 --><service name="TicketService" provider="java:RPC"><!-- 允许访问全部方法 --><parameter name="allowedMethods" value="*" /><parameter name="scope" value="Session" /><parameter name="className"value="org.was.service.TicketService" /></service>
???? 对应service服务Java代码如下:
package org.was.service;/** * 公开服务 * * @author orientalpigeon * */public class TicketService {public int getTicketNumber(String trainNo){int ticketNumber = 0;if("T261".equals(trainNo)){ticketNumber = 10;//}return ticketNumber;}}4、添加权限认证
??? 在wsdd文件中增加权限配置代码如下:
<!-- 自定义认证配置 --><handler name="Authenticate" type="java:org.was.security.AuthenticationHandler"/>
??? 修改wsdd配置中service标签内容为:
<!-- 自定义 Web Services 服务 --><service name="TicketService" provider="java:RPC"><!-- 允许访问全部方法 --><parameter name="allowedMethods" value="*" /><parameter name="scope" value="Session" /><parameter name="className"value="org.was.service.TicketService" /> <requestFlow> <!-- 增加认证handler --> <handler type="Authenticate"/> </requestFlow></service>
??? 认证Java代码如下:
package org.was.security;import javax.servlet.http.HttpServletRequest;import javax.xml.rpc.Call;import org.apache.axis.AxisFault;import org.apache.axis.MessageContext;import org.apache.axis.handlers.BasicHandler;import org.apache.axis.transport.http.HTTPConstants;/** * 用户权限认证处理 * * @author orientalpigeon * */public class AuthenticationHandler extends BasicHandler {private static final long serialVersionUID = -7685663586762871169L;private static final String PUBLIC_USER = "public";private static final String PUBLIC_PASSWORD = PUBLIC_USER;private static final String AUTHENTICATION_ERROR_MESSAGE = "用户名或密码不正确。";/** * 请求认证回到方法 * * @param messageContext * -用户上下文消息对象 */public void invoke(MessageContext messageContext) throws AxisFault {HttpServletRequest request = (HttpServletRequest) messageContext.getProperty(HTTPConstants.MC_HTTP_SERVLETREQUEST);//从请求header中获取可认证信息,很多人通常用Base64进行转码后认证String user = request.getHeader(Call.USERNAME_PROPERTY);String password = request.getHeader(Call.PASSWORD_PROPERTY);if (!PUBLIC_USER.equals(user) || !PUBLIC_PASSWORD.equals(password)) {throw new AxisFault("Server.Unauthenticated",AUTHENTICATION_ERROR_MESSAGE, null, null);}}}5、完整代码样例
???? 见附件。
?