???? 最近一项目,遇到一个变态客户,要用WebService作验证,来进行单点登陆,本来单点登陆也没有这么搞的,没办法,客户是蛮不讲理的那种,下面我们来小试牛刀一下。 ???? 一、创建WebService服务端的代码我就不说了,网上有不少用AXIS编写的代码,不过抄袭者众多,而且很多代码是很难与实际项目整合的,实际布署起来更是不可行,比如布署到IBM AIX系统上。 ????二、创建好服务端后,我们需要对Struts2的过滤器进行简单的改写,以便让客户端程序能正常访问WebService服务端。 ??? 三、在你的项目中创建一个包:org.apache.struts2.dispatcher,注意,这个包必须和Struts2中的过滤器包一样,并创建一个类,FilterDispatcher,接下来我们在doFilter中加入如下代码: ??? if("/WebServiceTest2/services/HelloWordWeb".endsWith(request.getRequestURI())||"/servlet/".endsWith(request.getRequestURI())) ???????? 这段代码是把webService中的服务器地址和AXIS中配置的servlet让过滤器放行。这样,我们的服务端就不会被拦截了。 ??? 四、整段代码如下: ?????????/* package org.apache.struts2.dispatcher; import java.io.IOException; import javax.servlet.Filter; import org.apache.struts2.RequestUtils; import com.opensymphony.xwork2.ActionContext; /** ??? /** ??? /** ??? /** ??? /** ??? /** ??? /** ??????????? initLogging(); ??????????? dispatcher = createDispatcher(filterConfig); ??????????? staticResourceLoader.setHostConfig(new FilterHostConfig(filterConfig)); ??? private void initLogging() { ??????? log = LoggerFactory.getLogger(FilterDispatcher.class); ??? } ??? /** ??? /** ??? /** ??? /** ??? /** ??? /** ??? /** ??????? Dispatcher du = Dispatcher.getInstance(); ??????? // Prepare and wrap the request if the cleanup filter hasn't already, cleanup filter should be ??????????? Dispatcher.setInstance(dispatcher); ??????????? // prepare the request no matter what - this ensures that the proper character encoding ??????? try { ??????? return request; ??? /** ?????????????????? // FIXME: this should be refactored better to not duplicate work with the action invocation ?????????????????? UtilTimerStack.push(timerKey); ?????????????????? if (mapping == null) { ?????????????????????? if ("".equals(resourcePath) && null != request.getPathInfo()) { ?????????????????????? if (staticResourceLoader.canHandle(resourcePath)) { ?????????????????? dispatcher.serviceAction(request, response, servletContext, mapping); ?????????????? } finally {
??????? {
??????? ?
??????????? ??chain.doFilter(req,res);
??????? }
?* $Id: FilterDispatcher.java 674498 2008-07-07 14:10:42Z mrdon $
?*
?* Licensed to the Apache Software Foundation (ASF) under one
?* or more contributor license agreements.? See the NOTICE file
?* distributed with this work for additional information
?* regarding copyright ownership.? The ASF licenses this file
?* to you under the Apache License, Version 2.0 (the
?* "License"); you may not use this file except in compliance
?* with the License.? You may obtain a copy of the License at
?*
?*??http://www.apache.org/licenses/LICENSE-2.0
?*
?* Unless required by applicable law or agreed to in writing,
?* software distributed under the License is distributed on an
?* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
?* KIND, either express or implied.? See the License for the
?* specific language governing permissions and limitations
?* under the License.
?*/
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.StrutsStatics;
import org.apache.struts2.dispatcher.mapper.ActionMapper;
import org.apache.struts2.dispatcher.mapper.ActionMapping;
import org.apache.struts2.dispatcher.ng.filter.FilterHostConfig;
import org.apache.struts2.util.ClassLoaderUtils;
import com.opensymphony.xwork2.config.Configuration;
import com.opensymphony.xwork2.config.ConfigurationProvider;
import com.opensymphony.xwork2.inject.Inject;
import com.opensymphony.xwork2.util.ValueStack;
import com.opensymphony.xwork2.util.ValueStackFactory;
import com.opensymphony.xwork2.util.logging.Logger;
import com.opensymphony.xwork2.util.logging.LoggerFactory;
import com.opensymphony.xwork2.util.profiling.UtilTimerStack;
?* Master filter for Struts that handles four distinct
?* responsibilities:
?* <p/>
?* <ul>
?* <p/>
?* <li>Executing actions</li>
?* <p/>
?* <li>Cleaning up the?{@link?ActionContext} (see note)</li>
?* <p/>
?* <li>Serving static content</li>
?* <p/>
?* <li>Kicking off XWork's interceptor chain for the request lifecycle</li>
?* <p/>
?* </ul>
?* <p/>
?* <p/> <b>IMPORTANT</b>: this filter must be mapped to all requests. Unless you know exactly what you are doing, always
?* map to this URL pattern: /*
?* <p/>
?* <p/> <b>Executing actions</b>
?* <p/>
?* <p/> This filter executes actions by consulting the?{@link?ActionMapper} and determining if the requested URL should
?* invoke an action. If the mapper indicates it should, <b>the rest of the filter chain is stopped</b> and the action is
?* invoked. This is important, as it means that filters like the SiteMesh filter must be placed <b>before</b> this
?* filter or they will not be able to decorate the output of actions.
?* <p/>
?* <p/> <b>Cleaning up the?{@link?ActionContext}</b>
?* <p/>
?* <p/> This filter will also automatically clean up the?{@link?ActionContext} for you, ensuring that no memory leaks
?* take place. However, this can sometimes cause problems integrating with other products like SiteMesh. See?{@link
?* ActionContextCleanUp} for more information on how to deal with this.
?* <p/>
?* <p/> <b>Serving static content</b>
?* <p/>
?* <p/> This filter also serves common static content needed when using various parts of Struts, such as JavaScript
?* files, CSS files, etc. It works by looking for requests to /struts/*, and then mapping the value after "/struts/"
?* to common packages in Struts and, optionally, in your class path. By default, the following packages are
?* automatically searched:
?* <p/>
?* <ul>
?* <p/>
?* <li>org.apache.struts2.static</li>
?* <p/>
?* <li>template</li>
?* <p/>
?* </ul>
?* <p/>
?* <p/> This means that you can simply request /struts/xhtml/styles.css and the XHTML UI theme's default stylesheet
?* will be returned. Likewise, many of the AJAX UI components require various JavaScript files, which are found in the
?* org.apache.struts2.static package. If you wish to add additional packages to be searched, you can add a comma
?* separated (space, tab and new line will do as well) list in the filter init parameter named "packages". <b>Be
?* careful</b>, however, to expose any packages that may have sensitive information, such as properties file with
?* database access credentials.
?* <p/>
?* <p/>
?* <p/>
?* <p>
?* <p/>
?* This filter supports the following init-params:
?* <!-- START SNIPPET: params -->
?* <p/>
?* <ul>
?* <p/>
?* <li><b>config</b> - a comma-delimited list of XML configuration files to load.</li>
?* <p/>
?* <li><b>actionPackages</b> - a comma-delimited list of Java packages to scan for Actions.</li>
?* <p/>
?* <li><b>configProviders</b> - a comma-delimited list of Java classes that implement the
?*?{@link?ConfigurationProvider} interface that should be used for building the?{@link?Configuration}.</li>
?* <p/>
?* <li><b>loggerFactory</b> - The class name of the?{@link?LoggerFactory} implementation.</li>
?* <p/>
?* <li><b>*</b> - any other parameters are treated as framework constants.</li>
?* <p/>
?* </ul>
?* <p/>
?* <!-- END SNIPPET: params -->
?* <p/>
?* </p>
?* <p/>
?* To use a custom?{@link?Dispatcher}, the <code>createDispatcher()</code> method could be overriden by
?* the subclass.
?*
?* @version $Date: 2008-07-07 22:10:42 +0800 (星期一, 07 七月 2008) $ $Id: FilterDispatcher.java 674498 2008-07-07 14:10:42Z mrdon $
?* @deprecated Since Struts 2.1.3, use?{@link?org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter} instead or
?*?{@link?org.apache.struts2.dispatcher.ng.filter.StrutsPrepareFilter} and?{@link?org.apache.struts2.dispatcher.ng.filter.StrutsExecuteFilter}
?* if needing using the?{@link?ActionContextCleanUp} filter in addition to this one
?*
?* @see ActionMapper
?* @see ActionContextCleanUp
?* @see org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
?* @see org.apache.struts2.dispatcher.ng.filter.StrutsPrepareFilter
?* @see org.apache.struts2.dispatcher.ng.filter.StrutsExecuteFilter
?*/
public class FilterDispatcher implements StrutsStatics, Filter {
???? * Provide a logging instance.
???? */
??? private Logger log;
???? * Provide ActionMapper instance, set by injection.
???? */
??? private ActionMapper actionMapper;
???? * Provide FilterConfig instance, set on init.
???? */
??? private FilterConfig filterConfig;
???? * Expose Dispatcher instance to subclass.
???? */
??? protected Dispatcher dispatcher;
???? * Loads stattic resources, set by injection
???? */
??? protected StaticContentLoader staticResourceLoader;
???? * Initializes the filter by creating a default dispatcher
???? * and setting the default packages for static resources.
???? *
???? * @param filterConfig The filter configuration
???? */
??? public void init(FilterConfig filterConfig) throws ServletException {
??????? try {
??????????? this.filterConfig = filterConfig;
??????????? dispatcher.init();
??????????? dispatcher.getContainer().inject(this);
??????? } finally {
??????????? ActionContext.setContext(null);
??????? }
??? }
??????? String factoryName = filterConfig.getInitParameter("loggerFactory");
??????? if (factoryName != null) {
??????????? try {
??????????????? Class cls = ClassLoaderUtils.loadClass(factoryName, this.getClass());
??????????????? LoggerFactory fac = (LoggerFactory) cls.newInstance();
??????????????? LoggerFactory.setLoggerFactory(fac);
??????????? } catch (InstantiationException e) {
??????????????? System.err.println("Unable to instantiate logger factory: " + factoryName + ", using default");
??????????????? e.printStackTrace();
??????????? } catch (IllegalAccessException e) {
??????????????? System.err.println("Unable to access logger factory: " + factoryName + ", using default");
??????????????? e.printStackTrace();
??????????? } catch (ClassNotFoundException e) {
??????????????? System.err.println("Unable to locate logger factory class: " + factoryName + ", using default");
??????????????? e.printStackTrace();
??????????? }
??????? }
???? * Calls dispatcher.cleanup,
???? * which in turn releases local threads and destroys any DispatchListeners.
???? *
???? * @see javax.servlet.Filter#destroy()
???? */
??? public void destroy() {
??????? if (dispatcher == null) {
??????????? log.warn("something is seriously wrong, Dispatcher is not initialized (null) ");
??????? } else {
??????????? try {
??????????????? dispatcher.cleanup();
??????????? } finally {
??????????????? ActionContext.setContext(null);
??????????? }
??????? }
??? }
???? * Create a default?{@link?Dispatcher} that subclasses can override
???? * with a custom Dispatcher, if needed.
???? *
???? * @param filterConfig Our FilterConfig
???? * @return Initialized Dispatcher
???? */
??? protected Dispatcher createDispatcher(FilterConfig filterConfig) {
??????? Map<String, String> params = new HashMap<String, String>();
??????? for (Enumeration e = filterConfig.getInitParameterNames(); e.hasMoreElements();) {
??????????? String name = (String) e.nextElement();
??????????? String value = filterConfig.getInitParameter(name);
??????????? params.put(name, value);
??????? }
??????? return new Dispatcher(filterConfig.getServletContext(), params);
??? }
???? * Modify state of StrutsConstants.STRUTS_STATIC_CONTENT_LOADER setting.
???? * @param staticResourceLoader val New setting
???? */
??? @Inject
??? public void setStaticResourceLoader(StaticContentLoader staticResourceLoader) {
??????? this.staticResourceLoader = staticResourceLoader;
??? }
???? * Modify ActionMapper instance.
???? * @param mapper New instance
???? */
??? @Inject
??? public void setActionMapper(ActionMapper mapper) {
??????? actionMapper = mapper;
??? }
???? * Provide a workaround for some versions of WebLogic.
???? * <p/>
???? * Servlet 2.3 specifies that the servlet context can be retrieved from the session. Unfortunately, some versions of
???? * WebLogic can only retrieve the servlet context from the filter config. Hence, this method enables subclasses to
???? * retrieve the servlet context from other sources.
???? *
???? * @return the servlet context.
???? */
??? protected ServletContext getServletContext() {
??????? return filterConfig.getServletContext();
??? }
???? * Expose the FilterConfig instance.
???? *
???? * @return Our FilterConfit instance
???? */
??? protected FilterConfig getFilterConfig() {
??????? return filterConfig;
??? }
???? * Wrap and return the given request, if needed, so as to to transparently
???? * handle multipart data as a wrapped class around the given request.
???? *
???? * @param request? Our ServletRequest object
???? * @param response Our ServerResponse object
???? * @return Wrapped HttpServletRequest object
???? * @throws ServletException on any error
???? */
??? protected HttpServletRequest prepareDispatcherAndWrapRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException {
??????? // configured first before struts2 dispatcher filter, hence when its cleanup filter's turn,
??????? // static instance of Dispatcher should be null.
??????? if (du == null) {
??????????? // is used before invoking the mapper (see WW-9127)
??????????? dispatcher.prepare(request, response);
??????? } else {
??????????? dispatcher = du;
??????? }
??????????? // Wrap request first, just in case it is multipart/form-data
??????????? // parameters might not be accessible through before encoding (ww-1278)
??????????? request = dispatcher.wrapRequest(request, getServletContext());
??????? } catch (IOException e) {
??????????? String message = "Could not wrap servlet request with MultipartRequestWrapper!";
??????????? log.error(message, e);
??????????? throw new ServletException(message, e);
??????? }
??? }
???? * Process an action or handle a request a static resource.
???? * <p/>
???? * The filter tries to match the request to an action mapping.
???? * If mapping is found, the action processes is delegated to the dispatcher's serviceAction method.
???? * If action processing fails, doFilter will try to create an error page via the dispatcher.
???? * <p/>
???? * Otherwise, if the request is for a static resource,
???? * the resource is copied directly to the response, with the appropriate caching headers set.
???? * <p/>
???? * If the request does not match an action mapping, or a static resource page,
???? * then it passes through.
???? *
???? * @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain)
???? */
??? public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
??????? HttpServletRequest request = (HttpServletRequest) req;
??????? if("/WebServiceTest2/services/HelloWordWeb".endsWith(request.getRequestURI())||"/servlet/".endsWith(request.getRequestURI()))
??????? {
??????? ?
??????? ?chain.doFilter(req,res);
??????? }
??????? else
??????? {
??????? ??? HttpServletResponse response = (HttpServletResponse) res;
?????????????? ServletContext servletContext = getServletContext();
????????????????
?????????????? String timerKey = "FilterDispatcher_doFilter: ";
?????????????? try {
?????????????????? ValueStack stack = dispatcher.getContainer().getInstance(ValueStackFactory.class).createValueStack();
?????????????????? ActionContext ctx = new ActionContext(stack.getContext());
?????????????????? ActionContext.setContext(ctx);
?????????????????? request = prepareDispatcherAndWrapRequest(request, response);
?????????????????? ActionMapping mapping;
?????????????????? try {
?????????????????????? mapping = actionMapper.getMapping(request, dispatcher.getConfigurationManager());
?????????????????? } catch (Exception ex) {
?????????????????????? log.error("error getting ActionMapping", ex);
?????????????????????? dispatcher.sendError(request, response, servletContext, HttpServletResponse.SC_INTERNAL_SERVER_ERROR, ex);
?????????????????????? return;
?????????????????? }
?????????????????????? // there is no action in this request, should we look for a static resource?
?????????????????????? String resourcePath = RequestUtils.getServletPath(request);
?????????????????????????? resourcePath = request.getPathInfo();
?????????????????????? }
?????????????????????????? staticResourceLoader.findStaticResource(resourcePath, request, response);
?????????????????????? } else {
?????????????????????????? // this is a normal request, let it pass through
?????????????????????????? chain.doFilter(request, response);
?????????????????????? }
?????????????????????? // The framework did its job here
?????????????????????? return;
?????????????????? }
?????????????????? try {
?????????????????????? ActionContextCleanUp.cleanUp(req);
?????????????????? } finally {
?????????????????????? UtilTimerStack.pop(timerKey);
?????????????????? }
?????????????? }
??????? }
?????
??? }
}
详细解决方案
struts2与WebService调整
热度:371 发布时间:2012-08-21 13:00:21.0
相关解决方案
- struts2.xml的action中的result报错,该怎么处理
- (Struts2+JSON+Ajax) XMLHttpRequest ==500如何解决
- struts2 对象属性流入不进去, 报错:target is null for setProperty(null, "x" [Ljava.lang.Stri
- Struts2 <select>上拉框 回显有关问题
- struts2 添加和修改怎么在一个jsp页面实现
- struts2 查询输出的有关问题
- 零配置的有关问题(struts2+Hibernate)
- struts2 神奇有关问题,太神奇了!
- struts2 的<s:iterator>标签展示未完全初始化的数组出现奇怪的有关问题
- struts2 文件下传有关问题
- struts2+ajax请求失败,帮忙看一上
- struts2-json中诠注@JSON(deserialize=false)是什么用?不是阻止JSON反序列化成JAVA对象吗?求解
- struts2 循环累加属性值有关问题
- struts2,hibernate,spring3 常用框架的API CHM版本,该怎么处理
- struts2 将jsp回到到另一个jsp中
- struts2 提交表单不能跳转页面有关问题!action已经执行,但是不能跳转到指定的页面
- struts2,hibernate,spring3 惯用框架的API CHM版本
- Struts2+Spring+JPA+FREEMARKER 登录程序异常
- struts2+Hibernate一个很奇怪的现象,该如何解决
- struts2 action中部分语句被直接跳过不执行. 请教这会是什么原因
- struts2+iReport 子表格 急需高手解决,已经困惑三天了!
- import cn.luxh.struts2.entity.Novel 急需的jar包是哪个
- struts2 hibernate 分页有关问题
- struts2 + spring 整合有关问题
- 请教哪里可以上到 struts2-json-plugin-2.1.8的源文件
- struts2+freemarker中文参数乱码有关问题
- struts2 exception,该怎么解决
- struts2 fileupload 下传有关问题
- struts2.3.4+spring3.1+mybats帮忙看看这个有关问题
- struts2 部署有关问题