servlet 中使用 Ecache 报错,而在简单的测试用例中正常。

想简单实现一个SSO单点登陆的系统,就是用servlet来简单模拟一下。授权过程中的token之类的想放在

Ecache里面,然后就出现了上面的问题,service 中就直接报错

java.lang.ClassNotFoundException: 

org.ehcache.config.builders.UserManagedCacheBuilder

而在测试中没问题。

maven 代码

<dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.1</version>
        </dependency>
        <dependency>
            <groupId>org.ehcache</groupId>
            <artifactId>ehcache</artifactId>
            <version>3.6.1</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.25</version>
        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
            <version>1.7.25</version>
        </dependency>

Ecache 简单工具类代码

public class EcacheManage {
    private static UserManagedCache<Object, Object> cache;

    static {
        init();
    }

    private static UserManagedCache<Object, Object> getCache() {
        if (cache == null) {
            init();
        }
        return cache;
    }

    private static void init() {
        if (cache != null) {
            return;
        }
       cache = UserManagedCacheBuilder.newUserManagedCacheBuilder(Object.class, Object.class).build(Boolean.TRUE);
    }

    public static Object getObject(Object key) {
        return getCache().get(key);
    }

    public static void putObject(Object key, Object value) {
        getCache().put(key, value);
    }

    public static void emptyEcache(){
        getCache().close();
    }
}

测试用例代码正常

public class EcacheTest {
    public static void main(String[] args) {
        EcacheManage.putObject("1", "1");
        String test = (String)EcacheManage.getObject("1");
    }
}

servlet 中service 就出错了

public class SecurityLoginServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String user = req.getParameter("user");
        String password = req.getParameter("password");
        String targetURL = req.getParameter("targetURL");
        if (user.equals(password)) {
            HttpSession session = req.getSession();
            String loginToken = UUID.randomUUID().toString().replaceAll("-", "");
            EcacheManage.putObject(loginToken, Boolean.TRUE);//此句报错
            session.setAttribute("authenticate", loginToken);
            resp.sendRedirect("authenticate?targetURL=" + targetURL);
        } else {
            resp.sendRedirect("index.jsp?targetURL=" + targetURL);
        }
    }

    @Override
    public void destroy() {
        EcacheManage.emptyEcache();
    }

不知道大家有没有遇到这种问题。

阅读 1.5k
1 个回答

tomcat jar包冲突了吧或者jar包丢了,百度一下,答案很多的

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题